package cn.getech.data.development.service;


import cn.getech.data.development.entity.ProcUser;
import cn.getech.data.development.entity.TableFieldRules;
import cn.getech.data.development.entity.dataMap.DataApplication;
import cn.getech.data.development.entity.permission.TableInfoPermission;
import cn.getech.data.development.entity.permission.TenantTableInfoPermission;
import cn.getech.data.development.entity.ranger.RangerGroup;
import cn.getech.data.development.model.dto.TableFieldRulesDto;
import cn.getech.data.development.model.dto.UserAndTableDto;
import cn.getech.data.development.model.ranger.RangerPolicy;
import cn.getech.data.development.model.ranger.RangerPolicyDto;
import cn.getech.data.development.model.ranger.RangerService;
import cn.getech.data.development.model.ranger.RangerUser;
import cn.getech.system.center.model.req.role.RoleUsers;

import java.util.List;
import java.util.Set;

/**
 * @company: getech[tcl]
 * @author: hujz
 * @Date: 2019/12/27 16:14
 * @Description: ranger 数据权限的 service
 */
public interface RangerDataService {

    void init();

    /**
     * @Description 根据服务的名字查询到对应的服务
     * @Author hujz
     * @Date 2019/12/30 17:08
     * @Param name 服务的名字
     * @Return
     * @Exception
     */
    RangerService getServiceByName(String name);


    /**
     * @Description 新增服务
     * @Author hujz
     * @Date 2019/12/30 17:08
     * @Param rangerService 服务对象
     * @Return
     * @Exception
     */
    RangerService addServiceByService(RangerService rangerService);


    /**
     * @Description 修改服务
     * @Author hujz
     * @Date 2019/12/30 17:08
     * @Param rangerService 服务对象
     * @Return
     * @Exception
     */
    RangerService updateServiceByServiceName(RangerService rangerService, String name);


    /**
     * @Description 删除服务
     * @Author hujz
     * @Date 2019/12/30 17:08
     * @Param name 服务名字
     * @Return
     * @Exception
     */
    void deleteByServiceName(String name);

    /**
     * 使用队列延迟更新策略
     */
    void synUpdateRangerPolicy();
    /**
     * @Description 新增策略
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param rangerPolicy 策略实体
     * @Return
     * @Exception
     */
    RangerPolicy addRangerPolicy(RangerPolicy rangerPolicy);

    /**
     * @Description 查询策略根据其id
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param id 策略id
     * @Return
     * @Exception
     */
    RangerPolicy getRangerPolicy(int id);


    /**
     * @Description 更新策略
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param rangerPolicy 更新策略
     * @Return
     * @Exception
     */
    RangerPolicy putRangerPolicy(RangerPolicy rangerPolicy, int id);


    /**
     * @Description 删除策略
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param id 策略id
     * @Return
     * @Exception
     */
    void deleteRangerPolicy(int id);


    /**
     * @Description 新增用户
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param rangerUser 用户
     * @Return
     * @Exception
     */
    RangerUser addRangerUser(RangerUser rangerUser);


    /**
     * @Description 查询用户
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param name 用户名字
     * @Return
     * @Exception
     */
    RangerUser getRangerUser(String name);

    /**
     * @Description 删除用户
     * @Author hujz
     * @Date 2019/12/30 17:40
     * @Param userName 用户名字
     * @Return
     * @Exception
     */
    void deleteRangerUser(String userName);


    /**
     * @Description 综合生成对应的全部策略.（所有用户和所有的表生成对应的策略）
     * @Author hujz
     * @Date 2020/1/10 17:40
     * @Param type  0: 库表字段权限策略类型   1：字段加密权限策略类型  2：行过滤策略类型  3:生成0和2两种类型
     * @Param userAndTableDtos 所有的用户对应的所有的表的集合
     * @Return List<RangerPolicyDto>  用户所有的策略
     * @Exception
     */
    List<RangerPolicyDto> listAllUserAndTablesPression(Integer type,List<UserAndTableDto> userAndTableDtos);

    /***
     * 生成对应的用户的策略
     * @param userIds 用户信息
     */
    void genteratorRangerPolicy(List<Long> userIds);


    /***
     * 新增策略---新增行类型的策略
     * @param tableFieldRules
     */
    void saveOrUpdateRangerPolicy(TableFieldRules tableFieldRules);

    /***
     * 新增策略---新增行类型的策略---针对单个表
     * @param tableId
     */
    void saveRangerPolicy(Integer tableId);

    /***
     * 生成表的策略 ---  字段策略
     * @param tableId 表的id
     */
    void genteratorRangerPolicy(Integer tableId);

    void saveAllPolicy(Integer roleId);


    void deleteRangerPolicy(ProcUser procUser);

    /***
     * 新增这个表的这个用户的策略
     * @param tableId  表id
     * @param userId   用户id
     */
    void saveRangerPolicyByTableId(Integer tableId,Long userId);

    void deleteRangerPloicyByTableId(Integer tableId);

    void updateRangerPolicyByTableId(Integer tableId);

    void initPolicyDataList();


    /***
     * 根据字段id去删除对应的策略
     * @param tableFieldId
     */
    void deleteRangerPolicyMasking(Integer tableFieldId);

    /***
     * 取消项目中关联的表
     * @param proc_id
     * @param table_id
     */
    void deleteRangerPloicyByProcIdAndTableId(Integer proc_id, Integer table_id);

    /***
     * 关联表时，这个项目下其他的组员，都应该对应的生成这个表的策略
     * @param procId
     * @param tableId
     */
    void saveRangerPolicyByProcIdAndTableId(Integer procId, Integer tableId);

    /***
     * 根据工程id重新生成行规则策略
     * @param procId
     */
    void saveRangerPolicyROWFirlterByProcId(Integer procId);

    /***
     * 删除对应的策略
     */
    void deleteAllUserRangerRel();

    /***
     * 保存数据脱敏的策略
     * @param tableFieldId  表的字段id
     */
    void saveRangerPolicyMaskingByTableFieldId(Integer tableFieldId);

    void saveRangerPolicyMasking(Integer tableId);


    /***
     * 初始化所有配置行规则的策略
     * @return
     */
     void initAllHaveRowRulesTablePolicy();

    /***
     * 初始化所有的行规则策略数据
     */
    void initAllHaveMaskRulesTablePolicy();

    void deleteRangerByRangerUserName(String userName);

    /**
     * 异步保存数据
     * 生成ranger策略信息
     */
    void saveOrUpdateRangerPolicy(List<TableInfoPermission> dataList);

    /**
     * 异步保存数据
     * 生成ranger策略信息
     */
    void saveOrUpdateRangerPolicyByTenant(List<TenantTableInfoPermission> dataList);



    /**
     * 删除ranger角色
     */
    void deleteRangerGroup(String groupName) ;

    /**
     * 获取角色
     */
    RangerGroup getRangerGroup(String groupName) ;

    /**
     * 添加角色
     */
    RangerGroup addRangerGroup(RangerGroup rangerGroup) ;

    /**
     *
     */
    void saveOrUpdateRangerPolicy(DataApplication apply);

    /**
     *更新策略
     */
    void updateRangerPolicy(List<RoleUsers> roleList);

    /**
     * 初始化表策略
     */
    void intiCreateTable(Set<String> intiCreateTable);
}
